From 59120d8bfd7ec9d6d254065f3de3c9729e3c9a1d Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Mon, 14 May 2007 10:16:07 +0000 Subject: [PATCH] Convert the GtkTreeIter inside the sorting functions for the search and 2007-05-14 Emmanuele Bassi * gtk/gtkfilechooserdefault.c: Convert the GtkTreeIter inside the sorting functions for the search and recent modes. This doesn't yet fix the segfault when clicking the 'Name' column in recent mode, though. svn path=/trunk/; revision=17843 --- ChangeLog | 7 ++++ gtk/gtkfilechooserdefault.c | 67 ++++++++++++++++++++++++++----------- 2 files changed, 54 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index bfe45b224f..7c2b50d821 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2007-05-14 Emmanuele Bassi + + * gtk/gtkfilechooserdefault.c: + Convert the GtkTreeIter inside the sorting functions for the + search and recent modes. This doesn't yet fix the segfault when + clicking the 'Name' column in recent mode, though. + 2007-05-14 Behdad Esfahbod * modules/input/gtkimcontextthai.c diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c index d62981e664..7e44643699 100644 --- a/gtk/gtkfilechooserdefault.c +++ b/gtk/gtkfilechooserdefault.c @@ -8936,14 +8936,19 @@ search_column_path_sort_func (GtkTreeModel *model, GtkTreeIter *b, gpointer user_data) { + GtkFileChooserDefault *impl = user_data; + GtkTreeIter child_a, child_b; const char *collation_key_a, *collation_key_b; gboolean is_folder_a, is_folder_b; - gtk_tree_model_get (model, a, + gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_a, a); + gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_b, b); + + gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_a, SEARCH_MODEL_COL_IS_FOLDER, &is_folder_a, SEARCH_MODEL_COL_COLLATION_KEY, &collation_key_a, -1); - gtk_tree_model_get (model, b, + gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_b, SEARCH_MODEL_COL_IS_FOLDER, &is_folder_b, SEARCH_MODEL_COL_COLLATION_KEY, &collation_key_b, -1); @@ -8968,20 +8973,24 @@ search_column_mtime_sort_func (GtkTreeModel *model, GtkTreeIter *b, gpointer user_data) { + GtkFileChooserDefault *impl = user_data; + GtkTreeIter child_a, child_b; const struct stat *statbuf_a, *statbuf_b; gboolean is_folder_a, is_folder_b; + gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_a, a); + gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_b, b); + /* Note that although we store a whole struct stat in the model, we only * compare the mtime here. If we add another column relative to a struct stat * (e.g. a file size column), we'll want another sort callback similar to this * one as well. */ - - gtk_tree_model_get (model, a, + gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_a, SEARCH_MODEL_COL_IS_FOLDER, &is_folder_a, SEARCH_MODEL_COL_STAT, &statbuf_a, -1); - gtk_tree_model_get (model, b, + gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_b, SEARCH_MODEL_COL_IS_FOLDER, &is_folder_b, SEARCH_MODEL_COL_STAT, &statbuf_b, -1); @@ -9127,13 +9136,11 @@ search_setup_model (GtkFileChooserDefault *impl) gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->search_model_sort), SEARCH_MODEL_COL_PATH, search_column_path_sort_func, - impl, - NULL); + impl, NULL); gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->search_model_sort), SEARCH_MODEL_COL_STAT, search_column_mtime_sort_func, - impl, - NULL); + impl, NULL); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (impl->search_model_sort), SEARCH_MODEL_COL_STAT, GTK_SORT_DESCENDING); @@ -9440,14 +9447,19 @@ recent_column_mtime_sort_func (GtkTreeModel *model, GtkTreeIter *b, gpointer user_data) { + GtkFileChooserDefault *impl = user_data; + GtkTreeIter child_a, child_b; GtkRecentInfo *info_a, *info_b; gboolean is_folder_a, is_folder_b; - gtk_tree_model_get (model, a, + gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_a, a); + gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_b, b); + + gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_a, RECENT_MODEL_COL_IS_FOLDER, &is_folder_a, RECENT_MODEL_COL_INFO, &info_a, -1); - gtk_tree_model_get (model, b, + gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_b, RECENT_MODEL_COL_IS_FOLDER, &is_folder_b, RECENT_MODEL_COL_INFO, &info_b, -1); @@ -9476,10 +9488,22 @@ recent_column_path_sort_func (GtkTreeModel *model, GtkTreeIter *b, gpointer user_data) { + GtkFileChooserDefault *impl = user_data; + GtkTreeIter child_a, child_b; + gboolean is_folder_a, is_folder_b; gchar *name_a, *name_b; - gtk_tree_model_get (model, a, RECENT_MODEL_COL_DISPLAY_NAME, &name_a, -1); - gtk_tree_model_get (model, b, RECENT_MODEL_COL_DISPLAY_NAME, &name_b, -1); + gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_a, a); + gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_b, b); + + gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_a, + RECENT_MODEL_COL_IS_FOLDER, &is_folder_a, + RECENT_MODEL_COL_DISPLAY_NAME, &name_a, + -1); + gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_b, + RECENT_MODEL_COL_IS_FOLDER, &is_folder_b, + RECENT_MODEL_COL_DISPLAY_NAME, &name_b, + -1); if (!name_a) return 1; @@ -9487,6 +9511,9 @@ recent_column_path_sort_func (GtkTreeModel *model, if (!name_b); return -1; + if (is_folder_a != is_folder_b) + return is_folder_a ? 1 : -1; + return strcmp (name_a, name_b); } @@ -9611,17 +9638,20 @@ recent_setup_model (GtkFileChooserDefault *impl) */ impl->recent_model_sort = GTK_TREE_MODEL_SORT (recent_model_sort_new (impl, GTK_TREE_MODEL (impl->recent_model_filter))); + gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->recent_model_sort), + RECENT_MODEL_COL_PATH, + recent_column_path_sort_func, + impl, NULL); gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->recent_model_sort), RECENT_MODEL_COL_INFO, recent_column_mtime_sort_func, impl, NULL); - gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->recent_model_sort), - RECENT_MODEL_COL_PATH, - recent_column_path_sort_func, - impl, NULL); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (impl->recent_model_sort), RECENT_MODEL_COL_INFO, GTK_SORT_DESCENDING); + + gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view), + GTK_TREE_MODEL (impl->recent_model_sort)); } typedef struct @@ -9638,9 +9668,6 @@ recent_idle_cleanup (gpointer data) RecentLoadData *load_data = data; GtkFileChooserDefault *impl = load_data->impl; - gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view), - GTK_TREE_MODEL (impl->recent_model_sort)); - set_busy_cursor (impl, FALSE); impl->load_recent_id = 0; -- 2.30.2